تحلیل داده به روش PCA¶

هدف: تشخیص اینکه کدام ارقام دست‌نویس با استفاده از روش PCA بیشتر از بقیه متمایز هستند.¶

فرض کنید در حال کار روی یک سرویس تشخیص تصویر برای یک شرکت پستی هستید. این سرویس قصد دارد تا ارقام دست‌نویس را به صورت خودکار تشخیص دهد. (این روش در حال توسط خدمات پستی مدرن مورد استفاده قرار گرفته و حتی از دقت بیشتری نسبت به انسان برخوردار است).
شرکت پستی می‌خواهد بداند کدام ارقام دست‌نویس سختر قابل تشخیص هستند (نسبت به یکدیگر) تا بتواند روی جمع‌آوری نمونه‌های بیشتری از آن داده‌ها تمرکز کند.
شما یک دیتاست از ارقام دست‌نویس در اختیار خواهید داشت و باید با استفاده از روش PCA مولفه های اصلی آنها را جدا کرده و تشخیص دهید که کدام ارقام به راحتی از بقیه قابل تمایز هستند.

کتابخانه هایی که شاید نیاز به استفاده از آنها داشته باشید:¶

In [1]:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

در خانه پایین, اطلاعات موجود در فایل digits.csv را به صورت یک dataframe لود کنید و ستون ها اضافی از آن (ستون number_lable) را حذف کنید و آن را نمایش دهید (نمونه خروجی در زیر آمده)¶

In [2]:
 
Out[2]:
pixel_0_0 pixel_0_1 pixel_0_2 pixel_0_3 pixel_0_4 pixel_0_5 pixel_0_6 pixel_0_7 pixel_1_0 pixel_1_1 ... pixel_6_7 pixel_7_0 pixel_7_1 pixel_7_2 pixel_7_3 pixel_7_4 pixel_7_5 pixel_7_6 pixel_7_7 number_label
0 0.0 0.0 5.0 13.0 9.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 6.0 13.0 10.0 0.0 0.0 0.0 0
1 0.0 0.0 0.0 12.0 13.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 11.0 16.0 10.0 0.0 0.0 1
2 0.0 0.0 0.0 4.0 15.0 12.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 3.0 11.0 16.0 9.0 0.0 2
3 0.0 0.0 7.0 15.0 13.0 1.0 0.0 0.0 0.0 8.0 ... 0.0 0.0 0.0 7.0 13.0 13.0 9.0 0.0 0.0 3
4 0.0 0.0 0.0 1.0 11.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 2.0 16.0 4.0 0.0 0.0 4
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1792 0.0 0.0 4.0 10.0 13.0 6.0 0.0 0.0 0.0 1.0 ... 0.0 0.0 0.0 2.0 14.0 15.0 9.0 0.0 0.0 9
1793 0.0 0.0 6.0 16.0 13.0 11.0 1.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 6.0 16.0 14.0 6.0 0.0 0.0 0
1794 0.0 0.0 1.0 11.0 15.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 2.0 9.0 13.0 6.0 0.0 0.0 8
1795 0.0 0.0 2.0 10.0 7.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 5.0 12.0 16.0 12.0 0.0 0.0 9
1796 0.0 0.0 10.0 14.0 8.0 1.0 0.0 0.0 0.0 2.0 ... 0.0 0.0 1.0 8.0 12.0 14.0 12.0 1.0 0.0 8

1797 rows × 65 columns

In [3]:
 
Out[3]:
pixel_0_0 pixel_0_1 pixel_0_2 pixel_0_3 pixel_0_4 pixel_0_5 pixel_0_6 pixel_0_7 pixel_1_0 pixel_1_1 ... pixel_6_6 pixel_6_7 pixel_7_0 pixel_7_1 pixel_7_2 pixel_7_3 pixel_7_4 pixel_7_5 pixel_7_6 pixel_7_7
0 0.0 0.0 5.0 13.0 9.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 6.0 13.0 10.0 0.0 0.0 0.0
1 0.0 0.0 0.0 12.0 13.0 5.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 11.0 16.0 10.0 0.0 0.0
2 0.0 0.0 0.0 4.0 15.0 12.0 0.0 0.0 0.0 0.0 ... 5.0 0.0 0.0 0.0 0.0 3.0 11.0 16.0 9.0 0.0
3 0.0 0.0 7.0 15.0 13.0 1.0 0.0 0.0 0.0 8.0 ... 9.0 0.0 0.0 0.0 7.0 13.0 13.0 9.0 0.0 0.0
4 0.0 0.0 0.0 1.0 11.0 0.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 0.0 2.0 16.0 4.0 0.0 0.0
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
1792 0.0 0.0 4.0 10.0 13.0 6.0 0.0 0.0 0.0 1.0 ... 4.0 0.0 0.0 0.0 2.0 14.0 15.0 9.0 0.0 0.0
1793 0.0 0.0 6.0 16.0 13.0 11.0 1.0 0.0 0.0 0.0 ... 1.0 0.0 0.0 0.0 6.0 16.0 14.0 6.0 0.0 0.0
1794 0.0 0.0 1.0 11.0 15.0 1.0 0.0 0.0 0.0 0.0 ... 0.0 0.0 0.0 0.0 2.0 9.0 13.0 6.0 0.0 0.0
1795 0.0 0.0 2.0 10.0 7.0 0.0 0.0 0.0 0.0 0.0 ... 2.0 0.0 0.0 0.0 5.0 12.0 16.0 12.0 0.0 0.0
1796 0.0 0.0 10.0 14.0 8.0 1.0 0.0 0.0 0.0 2.0 ... 8.0 0.0 0.0 1.0 8.0 12.0 14.0 12.0 1.0 0.0

1797 rows × 64 columns

یکی از تصاویر موجود در فایل (که به صورت یک بردار در فایل موجود است) را انتخاب کرده و آن را با استفاده از کتابخانه های پایتونی که در بالا هست نمایش دهید (خروجی شما باید چیزی شبیه به عکس های زیر باشد)¶

In [4]:
 
Out[4]:
<matplotlib.image.AxesImage at 0x277731be7e0>
No description has been provided for this image
In [5]:
 
Out[5]:
<matplotlib.image.AxesImage at 0x27773172cc0>
No description has been provided for this image
In [6]:
 
Out[6]:
<matplotlib.image.AxesImage at 0x2777543be00>
No description has been provided for this image
In [7]:
 
Out[7]:
<Axes: >
No description has been provided for this image

در مرحله اول, برای بدست آوردن نتایج درست باید اطلاعات را اسکیل کنید (برای اینکه مقادیر بزرگ تر باعث Bias شدن نتایج نشود, اطلاعات بیشتر در این زمینه را میتوانید در این لینک پیدا کنید https://shorturl.at/0V1vR) در سلول پایین اطلاعات را اسکیل کرده و آنها را نمایش دهید (به صورت آرایه)¶

In [8]:
 
Out[8]:
array([[ 0.        , -0.33501649, -0.04308102, ..., -1.14664746,
        -0.5056698 , -0.19600752],
       [ 0.        , -0.33501649, -1.09493684, ...,  0.54856067,
        -0.5056698 , -0.19600752],
       [ 0.        , -0.33501649, -1.09493684, ...,  1.56568555,
         1.6951369 , -0.19600752],
       ...,
       [ 0.        , -0.33501649, -0.88456568, ..., -0.12952258,
        -0.5056698 , -0.19600752],
       [ 0.        , -0.33501649, -0.67419451, ...,  0.8876023 ,
        -0.5056698 , -0.19600752],
       [ 0.        , -0.33501649,  1.00877481, ...,  0.8876023 ,
        -0.26113572, -0.19600752]])

در این بخش شما باید با استفاده از PCA دو مولفه اصلی را پیدا کرده, مختصات پیکسل ها را بر این اساس (به صورت آرایه) چاپ کنید و نمودار پراکندگی اعداد (مشابه عکس پایین) را رسم کنید و با توجه به نتایج بدست آمده در یک Markdown تحلیل خود را از اینکه تشخیص کدام اعداد از یکدیگر سخت تر است بیان کنید¶

In [9]:
 
Out[9]:
array([[-1.91421366, -0.95450157],
       [-0.58898033,  0.9246358 ],
       [-1.30203906, -0.31718883],
       ...,
       [-1.02259599, -0.14791087],
       [-1.07605522, -0.38090625],
       [ 1.25770233, -2.22759088]])
In [10]:
 
Out[10]:
<matplotlib.legend.Legend at 0x2777579a120>
No description has been provided for this image

تحیل خود را از اطلاعات بالا اینجا وارد کنید¶

در مرحله آخر, مشابه مرحله قبل سه مولفه اصلی PCA را پیدا کنید و نمودار پراکندگی 3 بعدی اعداد (مشابه عکس پایین) پیدا کرده و تحلیل خود را بیان کنید (اگر نمودار به صورت interactive باشد نمره امتیازی دارد!)¶

In [11]:
 
In [ ]: